.\"	@(#)acucntrl.8	6.2.1 (2.11BSD) 1996/11/27
.\"
.TH acucntrl 8 "November 27, 1996"
.UC 6
.SH NAME
acucntrl \- turn around tty line between dialin and dialout
.SH SYNOPSIS
.B /usr/libexec/acucntrl
keyword ttyline
.SH DESCRIPTION
.PP
.I Acucntrl
turns around terminal line, enabling it to be used for both dialin and dialout.
On dialin a terminal line is assumed to have  modem control enabled and a getty
process in existence waiting for logins.  On dialout modem control is disabled
and there is no getty process.
.PP
This program must be run setuid to root.
.PP
.I keyword
is chosen from the list:
.I disable
or
.IR dialout ,
to condition a line for dialout;
and
.I enable
or
.IR dialin ,
to condition a line for dialin.
.PP
When the line is conditioned for dialing out, the login name of the real uid
of the process is placed in /var/run/utmp in capitals.
This declares that the line is in use and acts as an additional locking
mechanism.
.I Acucntrl
will refuse to act if the /var/run/utmp entry for the line is not null,
is not the the user's login name (capitalized or not),
and if the process is not running as the superuser.
The last condition is to allow the superuser to clear the state of the line.
.PP
Turning modem control on or off is handled by poking into /dev/kmem.
It is currently implemented for dz, dh, and dmf lines.
.PP
Under 4.2 BSD the program will also refuse to disable a line if carrier is
sensed on it.  This is to avoid the dead period where someone has just dialed
in and made the connection but has not yet logged in.
.PP
.I Ttyline
can be either of the form tty* or /dev/tty*.
Enabling/disabling a line whose name does not begin with ttyd? is prohibited
unless the real uid of the process is 0 or if the login name corresponding to
the real uid is uucp.  This is a security precaution.
.PP 
Steps taken when disabling
.RI ( i . e .
setup for dialing out)
.IP 1)
check input arguments
.IP 2)
look in /var/run/utmp to check that the line is not in use by another user
.IP 3)
disable modem control on line
.IP 4)
check for carrier on device
.IP 5)
change owner of device to real uid
.IP 6)
edit /etc/ttys,  changing the first character of the appropriate line to 0
.IP 7)
send a hangup to process 1 to poke init to disable getty
.IP 8)
post uid name in capitals in /var/run/utmp to let world know device has been grabbed
.IP 9)
make sure that DTR is on
.PP
Steps taken when enabling
.RI ( i . e .
setup for dialin)
.IP 1)
check input arguments
.IP 2)
look in /var/run/utmp to check that the line is not in use by another user
.IP 3)
make sure modem control on line is disabled
.IP 4)
turn off DTR to make sure line is hung up
.IP 5)
condition line: clear exclusive use and set hangup on close modes
.IP 6)
turn on modem control
.IP 7)
edit /etc/ttys,  changing the first character of the appropriate line to 1
.IP 8)
send a hangup to process 1 to poke init to enable getty
.IP 9)
clear uid name for /var/run/utmp
.SH HISTORY
.PP
First written by Allan Wilkes (fisher!allan)
.PP
Modified June 8,1983 by W.Sebok (astrovax!wls) to poke the kernel rather
than use a kernel hack to turn on/off modem control, using a subroutine
stolen from a program written by Tsutomu Shimomura {astrovax,escher}!tsutomu
.PP
Worked over many times by W.Sebok
.RI ( i . e .
hacked to death)
.SH FILES
/dev/kmem, /vmunix, /etc/ttys, /var/run/utmp, /dev/tty*
.SH BUGS
.PP
Sensing carrier requires the 4.2 BSD TIOCMGET ioctl call.  Unfortunately this
ioctl is not implemented in the vanilla 4.2 BSD dh driver even though the
dz and dmf drivers use an emulation of the DH11's modem control bits. This
has been fixed here.
.PP
Some time (currently 2 seconds) is required between disabling modem control
and opening the device.  This is probably because of a race with getty whose
open is finally being allowed to complete.  This time interval may not be
enough on a loaded system.  Because of this problem and the above problem with
the dh driver there is deliberately no error message given when the TIOCMGET
ioctl fails.
.PP
Previously there was similar synchronization problem with the init process.
When dialins are disabled the capitalized name of the process cannot be posted
into /var/run/utmp until init has finished clearing /var/run/utmp.  However one does
not know how long that will take, and, on a loaded system,  it can take quite
a while.  This was solved by the strategy of 1) posting the name, 2) poking
init, 3) going into a loop where the process repeatedly waits a second and
checks whether the entry has been cleared from /var/run/utmp, and 4) posting the
name again.
